package cn.cmvideo.springboot.netty;

import java.net.InetSocketAddress;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyServer
{
	private static Logger log = LoggerFactory.getLogger(NettyServer.class);
	public static void main(String[] args) throws InterruptedException
	{
//		new Thread(new NettyServerThread()).start();
		ServerBootstrap bootstrap = new ServerBootstrap();

		// boss 线程组用于处理连接工作
		EventLoopGroup boss = new NioEventLoopGroup();
		// work 线程组用于数据处理
		EventLoopGroup work = new NioEventLoopGroup();

		/** 
		 *  NioSocketChannel，异步的客户端 TCP Socket 连接。
		 *  NioServerSocketChannel，异步的服务器端 TCP Socket 连接。
		 *  NioDatagramChannel，异步的 UDP 连接。
		 *  NioSctpChannel，异步的客户端 Sctp 连接。
		 *  NioSctpServerChannel，异步的 Sctp 服务器端连接，这些通道涵盖了 UDP 和 TCP 网络 IO 以及文件 IO。
		 */
		bootstrap.group(boss, work).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(8080))
				.option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true)
				.childOption(ChannelOption.TCP_NODELAY, true).childHandler(new NettyServerInitializer());
		
		ChannelFuture future;
		try
		{
			future = bootstrap.bind().sync();
			if(future.isSuccess())
			{
				log.info("启动 Netty Server");
			}
			future.channel().closeFuture().sync();
		} catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}

}
